Hanoi塔问题
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
(n阶Hanoi塔问题）假设有三个分别命名为A、B、C的塔座，在塔座A上插有n(n<20)个直径大小各不相同、依小到大编号为1，2，…，n的圆盘。现要求将A轴上的n个圆盘移至塔座C上并仍按同样顺序叠排，圆盘移动时必须遵循下列规则： 1）每次只能移动一个圆盘； 2）圆盘可以插在A、B、C中的任一塔座上； 3）任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 请通过编程来打印出移动的步骤.

输入描述:
只有一组输入数据.输入数据N(;表示在开始时A塔座上的盘子数),当输入0时程序结束.

输出描述:
输出移动的步骤.如"A-->C","A-->B"等.每两的步骤之间有三个空格隔开,每输出5个步骤就换行.详细的见Sample Output.

输入样例#:
5
2
0

输出样例#:
A-->C   A-->B   C-->B   A-->C   B-->A   
B-->C   A-->C   A-->B   C-->B   C-->A   
B-->A   C-->B   A-->C   A-->B   C-->B   
A-->C   B-->A   B-->C   A-->C   B-->A   
C-->B   C-->A   B-->A   B-->C   A-->C   
A-->B   C-->B   A-->C   B-->A   B-->C   
A-->C   
A-->B   A-->C   B-->C


#include<bits/stdc++.h>
using namespace std;

int i;
void print(char x,char y){//打印路径
    i++;
    if(i%5==0){
        printf("%c-->%c\n",x,y);
    }else{
        printf("%c-->%c   ",x,y);
    }
}

void hanoi(int n,char one,char two,char three){//把n个圆盘借助two,从one到three
    if(n==1){
        print(one,three);
    }else{
        hanoi(n-1,one,three,two);
        print(one,three);
        hanoi(n-1,two,one,three);
    }
}

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n==0){
            break;
        }
        if(i!=0){
            i=0;
        }
        hanoi(n,'A','B','C');
        printf("\n");
    }
    return 0;
}

